Repository navigation
fix: Setup form help speaks to an administrator; queue pages, mail status banner and test toast read in Chinese - #30551
Conversation
…pages and mail delivery Red on main: developer terms in served help, no sys_queue translations, English mail status and test toast under zh-CN. Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s Co-authored-by: Claude <noreply@anthropic.com>
…s and test-toast text Rows 1-3: business wording in the help on permission set and position assignments, out-of-office rules, business units, organization and user forms (English source and zh-CN). Row 7: sys_queue and sys_queue_member join plugin-sharing's translation bundle, with zh-CN. Row 8: the mail live-status statement and the Send test email answer are written in the caller's display language; settings action handlers now receive that locale. Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s Co-authored-by: Claude <noreply@anthropic.com>
…-JP and es-ES renderings; changeset Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s Co-authored-by: Claude <noreply@anthropic.com>
… help follow the new source Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s Co-authored-by: Claude <noreply@anthropic.com>
…n beside the administrator wording Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 6 package(s): 25 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 14 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 31 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 5226a73bc19c9e65edef26eb7c8e7eea695b6948 && git checkout 5226a73bc19c9e65edef26eb7c8e7eea695b6948
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 2ffdb649775d20313707d88a8388275f280a0a7f adc94da56e685a3ca37a2dbfcc0bdf4380b944dc && git checkout -B drift-repro 2ffdb649775d20313707d88a8388275f280a0a7f && git merge --no-ff adc94da56e685a3ca37a2dbfcc0bdf4380b944dc
node scripts/docs-audit/affected-docs.mjs --json 2ffdb649775d20313707d88a8388275f280a0a7f
|
|
domain:server#6 · os-bill · session_01Utp6CXCS98uhsFQYk64epE Contract reviewServed-tier: Scope: the ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
|
domain:server#6 · os-bill · session_01Utp6CXCS98uhsFQYk64epE 席位记录 · 2026-11-05T15:48Z · Head-sha
|
Conflicts: sys_organization.require_mfa help (source, en and zh-CN bundles) against #30529. Kept this branch's administrator wording, which already carries #30529's two-factor sentence; en confirmed by extract (byte-identical). Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Utp6CbDNK83SuSb8zsRt2s
|
domain:server#6 · os-bill · session_01Utp6CXCS98uhsFQYk64epE Contract reviewServed-tier: Delta review of the merge of ① Derived judgments
② Semver levelUnchanged: ③ Boundary flags
Implemented-by: VERDICT: PASS |
Requested by Bill · project thread
domain:server#6 · os-bill · session_01Utp6CXCS98uhsFQYk64epE
Refs #30208 (rows 1, 2, 3, 7, 8)
Clause-②: yes (widening)
Metadata-protocol: none
Skills-docs: none —
git grep -n -I -E "fail-closed at resolution|half-open \[from, until\)|graph semantics|root of tenant|HRIS sync|upstream HRIS|expanded by graph|When true, every member|When true, the user|task/run attribution|No mail leaves this machine|Sent test email" -- skillsone205cf31answers 0 lines; no published skill sentence quotes the replaced help or the mail status text.维护者速读
locale,已有处理函数不受影响。回滚即 revert 本 PR。packages/plugins/plugin-email/src/live-transport-status.ts(中英文案表与按语言取文案),packages/services/service-settings/src/settings-routes.ts与settings-service.ts的runAction(动作路由把请求语言交给处理函数),packages/plugins/plugin-sharing/scripts/i18n-extract.config.ts(队列两个对象进翻译包)。pnpm --filter @objectstack/plugin-email exec vitest run src/mail-log-provider.pin.test.ts,预期 13 条全过,其中 5 条是中文横幅与测试提示。What changes
Rows 1–3: field help in administrator wording (English source and zh-CN). Text only; no field name, key, option value or behaviour moves.
valid_fromvalid_untilreasonvalid_untilkindparent_business_unit_idactiveeffective_from/effective_to/external_refrequire_mfabanned,must_change_passwordThe English sources (
*.object.ts) say the same in English;en.*.generated.tsfollow by extract. Theactivesentence states whatBusinessUnitGraphServicedoes with an inactive unit (contributes no members and stops the descent into its subtree,plugin-sharing/src/business-unit-graph.ts);must_change_passwordnames the admin create, import and reset paths that set it (plugin-authadmin-user-endpoints.ts,admin-import-users.ts).Row 7: the 队列 and 队列成员 pages.
plugin-sharing's extract config now listsSysQueueandSysQueueMemberbeside its three sharing objects (thebundle-ownershiplist follows). The extract added both objects to every bundle; zh-CN is written by hand (队列 / 队列成员, every field, help, the member-type options and the two list-view names). ja-JP and es-ES carry the extract's English fill, except the member-type options, which reuse the renderingssys_record_share/sys_sharing_rulealready use in those bundles (the package'srecipient-vocabulary-consistencypin requires one rendering per option key).Row 8: Setup → Email.
plugin-email:describeLiveMailTransport(source, locale?)writes the banner from a per-language copy table (MAIL_DELIVERY_COPY, en and zh-CN;mailDeliveryCopyresolves exact, then by language, else English), the mechanismservice-settings' currency lock already uses for its live status. The plugin's live-status provider passes thelocalethe settings service already hands it. Themail/testhandler writes its sent, failed and log-only answers from the same table.service-settings:SettingsActionHandler's input gains an optionallocale;runAction(namespace, actionId, payload, ctx, display?)passesdisplay.localeto the handler; the POST action route passesrequestLocaleOf(req), the same reading the GET route gives the live status. The locale stays out ofctx. An existing handler compiles and behaves unchanged.Tests
One pin file per row, plus a route pin:
plugin-security/src/translations/assignment-help-wording.test.ts: served zh-CN (SecurityTranslations) and the English source ofvalid_from/valid_until/reasonon both assignment objects carry nofail-closed, interval notation oragent grants/ 智能体授权, and the zh-CN help is Chinese.plugin-approvals/src/translations/delegation-window-wording.test.ts:sys_approval_delegation.valid_until, same shape.platform-objects/src/identity/setup-form-admin-wording.test.ts: served zh-CN (SetupAppTranslations) and the English source of the nine business unit, organization and user fields carry no graph vocabulary, null literal,HRIS, boolean literal or HTTP status code.plugin-sharing/src/translations/queue-pages-zh-cn.test.ts: the served zh-CN bundle names 队列 / 队列成员 and translates every field label, help and member-type option.plugin-email/src/mail-log-provider.pin.test.ts(the existing Setup → Email harness, new top-leveldescribe): zh-CN banner for the out-of-the-box and the delivering transport, the zh-CN test toast, the zh-CN log-only warning, and a control (fr-FRanswers English).service-settings/src/settings-routes.test.ts: the POST action route hands the handlerzh-CNfromAccept-Language,undefinedwithout one, and not inctx.Red on
main(the pin commit0f390750, before the fix): security 10 failed / 2 passed, approvals 2/2 failed, platform-objects 18/18 failed, sharing 4/4 failed, email 4 failed / 9 passed (the control passed), settings routes 1 failed / 34 passed.Ablation (once,
scripts/ablation-replace.mjs, anchor hit x1, restored blob equals HEAD,git diff HEADempty): with the live-status provider callingdescribeLiveMailTransport(this.service)again (the locale dropped), exactly the two zh-CN statement pins go red, 2 failed / 11 passed.Acceptance notes
Refs; this PR follows the rulings, so merging leaves the card open for rows 5 and 6 (row 5 needs a settings shape; row 6 waits on the maintainer).valid_fromstill says "modo fail-closed"); they are legacy-trusted (no provenance record), so they keep serving that text. The queue objects arrive there as English fills, recorded in each locale'ssource-hashesfile. The seat's serial note puts those two languages with the pending seven-language pass on these packages.SMTP host is required — nothing was sent.,api_key is required, an unsupported provider, a transport that cannot be built) stay English; only the sent, failed and log-only answers moved.sys_setting/sys_platform_settingencryptedandlockedhelp still say 「为 true 时」 (an internal store, not a Setup form);sys_user_position.business_unit_idhelp namesreadScope/writeScope.mail.manifest.ts(plugin-emailandservice-settings) is not touched (another lane's card edits it).require_mfaand PR fix(plugin-auth,platform-objects): an organization's require-MFA refusal reads in the admin's language, a turn-on names the grace period, and the help says two-factor must be on (#30411) #30529: that open PR (another seat's card on the same field) rewrites this help to add that the requirement needs two-factor on for the deployment, keeping "When true". This PR's help keeps that sentence beside the administrator wording, in English and zh-CN, so whichever lands second resolves the textual conflict by taking this text; fix(plugin-auth,platform-objects): an organization's require-MFA refusal reads in the admin's language, a turn-on names the grace period, and the help says two-factor must be on (#30411) #30529's pins (two-factor authentication on for this deployment,OS_AUTH_TWO_FACTOR=truein every locale) hold against it. ja-JP and es-ES for that field are fix(plugin-auth,platform-objects): an organization's require-MFA refusal reads in the admin's language, a turn-on names the grace period, and the help says two-factor must be on (#30411) #30529's.Verification
Package suites and typechecks (head e205cf3; the later main merge brought one ui-only commit)
pnpm --filter @objectstack/PKG testandtypecheckfor service-settings, platform-objects, plugin-security, plugin-approvals, plugin-sharing, plugin-email: all exit 0 under the verify lock (VERDICT command-exit 0). plugin-sharing 66 files / 1409 tests after the ja-JP / es-ES option fix.pnpm check:i18n: all ten bundle sets in sync.pnpm i18n:extract: byte-identical.eslint --no-inline-configon the changed TypeScript files: exit 0.pnpm lint(repository-wide) on7e4a3272: exit 0.Derived gate families
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackonf63ad0b2(after theorigin/mainmerge) derived 66 commands over 32 changed paths. Each ran with its exit code captured before any pipe;--ran: 66 derived, 65 run, 1 NOT-MEASURED, 0 UNRUN.pnpm check:dual-build-cjs-loads: exit 3, PREREQUISITE NOT MET (it reads every package'sdist, and only this card's closure was built). NOT MEASURED here; CI'sLint & Repo Gatesruns it.pnpm check:i18n-stale-fill: exit 1 on the first pass. It foundsys_approval_delegation.valid_until.helpin ja-JP and es-ES still holding the byte-identical English fill of the old source. Both now carry the fill of the new source (recorded by the extract), and the gate exits 0 on07d639c3and on the final head.After the union two small commits landed:
07d639c3(those two fills) and7e4a3272(require_mfahelp, see Acceptance notes). The changed-path set grew from 32 to 36 paths; the derived gate family did not move (the same 66 commands). Re-run on7e4a3272:pnpm check:i18nexit 0,pnpm check:i18n-stale-fillexit 0,pnpm i18n:extractbyte-identical,pnpm --filter @objectstack/platform-objects test112 files / 1544 tests,pnpm --filter @objectstack/plugin-approvals test(on07d639c3) 112 files / 1471 tests.Generated by Claude Code